<?php


namespace App\Utils;


class CheckUtil
{
    /**
     * ----验证18位身份证号码的合法性
     * @param $id_card
     * @return bool
     */
    public static function CheckIsIDCard($id_card = '')
    {
        if(empty($id_card)) {
            return false;
        }
        if(mb_strlen($id_card) != 18) {
            return false;
        }
        //校验位列表
        $remainder_list = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
        //加权除以11的余数
        $square_remainder = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
        //取得身份证号码最后一位校验位
        $check_num = mb_substr($id_card, 17);
        //身份证参与校验的前17位
        $id_card = mb_substr($id_card, 0, 17);
        //参与校验的必须是数字
        if(!is_numeric($id_card)) {
            return false;
        }
        $square_sum = 0;//每一位参与校验数乘以加权数的累加和
        $number_sum = 0;//每一位参与校验数乘以加权除以11的余数的累加和
        for ($i = 0; $i < 17; $i++){
            //累加结果
            $square_sum += intval($id_card[$i]) * pow(2, 17 - $i);
            //累加结果
            $number_sum += intval($id_card[$i]) * $square_remainder[$i];
        }

        //从校验位列表中获取加权乘积和得到的校验位
        $check_get_square_remainder = isset($remainder_list[$square_sum % 11]) ? $remainder_list[$square_sum%11] : -1;
        //从校验位列表中获取加权余数乘积和得到的校验位
        $check_get_number_remainder = isset($remainder_list[$number_sum % 11]) ? $remainder_list[$number_sum % 11] : -1;

        if($check_get_square_remainder == $check_num && $check_get_number_remainder == $check_num) {
            return true;
        }
        return false;
    }

}
